import java.io.ByteArrayOutputStream;
import java.io.RandomAccessFile;

import com.colloquial.arithcode2.*;


class ArithCoder {

	public static void main(String[] args) {
	
		try {
			CompresorAritmetico Compresor = new CompresorAritmetico();
			TablaProbabilidades TablaP = new TablaProbabilidades();
			int pos= 0;
		
			RandomAccessFile ArchivoEntrada = new RandomAccessFile("c:/licencia.txt","rw");
			byte[] DatosTemporal=new byte[(int)ArchivoEntrada.length()];
			for (int i=0; i<ArchivoEntrada.length(); i++)
				DatosTemporal[i]=ArchivoEntrada.readByte();
			ArchivoEntrada.close();

			String Datos = new String(DatosTemporal,0,DatosTemporal.length,"UTF-16BE");
			
			byte[] bai = new byte[2];

			for (int i=0; i< Datos.length();i++){
				bai = Datos.substring(i, i+1).getBytes("UTF-16BE");
				pos = ConversionesTiposDatos.ObtenerIdCaracterUTF16BE(bai);
				Compresor.calcularIntervalo(TablaP, pos);
				TablaP.aumentarFrecuencia(pos);
			}
			Compresor.calcularIntervalo(TablaP, 65537);//Esto finaliza la compresion
				
			DescompresorAritmetico descomp = new DescompresorAritmetico(Compresor.getOutput());
			System.out.println("DATOS COMPRIMIDOS: ");
			Compresor.getOutput().PrintDatos();
			TablaProbabilidades TablaP2 = new TablaProbabilidades();
			boolean eof = false;
			while (!eof){
				eof = descomp.descomprimirSiguientePaso(TablaP2);
				TablaP2.aumentarFrecuencia(descomp.getUltimoDescomprimido());
			}
			 
			
			byte[] baDes = new byte[descomp.getOut().size()];
			baDes = descomp.getOut().toByteArray();
			
			String str = new String(baDes,0,baDes.length,"UTF-16BE");
			System.out.println(str);
			
			System.out.println("Tamanio original   (bytes): "+Datos.length()*2);
			System.out.println("Tamanio comprimido (bytes): "+Compresor.getOutput().Lenght()/8);

		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}    
}
